/*
 *  linux/lib/open.c
 *
 *  (C) 1991  Linus Torvalds
 */

#define __LIBRARY__
#include <unistd.h> // Linux标准头文件 定义了各种符号常数和类型 并申明了各种函数
#include <stdarg.h> // 标准参数头文件 以宏的形式定义变量参数列表
// 打开并有可能创建一个文件 参数：filename=文件名 flag-文件打开标志 返回：文件描述符 若出错则置出错码 并返回-1
int open(const char * filename, int flag, ...)
{
	register int res;
	va_list arg;
    // 利用va_start宏函数 取得flag后面参数得指针 然后调用系统中断 int0x80 功能open 进行文件打开操作
	va_start(arg,flag); // %0-eax(返回得描述符或出错码) %1-eax（系统中断调用功能号 _NR_open）
	__asm__("int $0x80" // %2-ebx(文件名filename) %3-ecx（打开文件标志flag） %4-edx（后随参数文件属性mode）
		:"=a" (res)
		:"0" (__NR_open),"b" (filename),"c" (flag),
		"d" (va_arg(arg,int)));
	if (res>=0) // 系统中断调用返回值大于或等于0 表示是一个文件描述符 则直接返回之
		return res;
	errno = -res;   // 否则说明返回值小于0 则代表一个出错码 设置该出错码并返回-1
	return -1;
}
